
package org.dromara.system.api.feign;

/**
 * @author: zhou shuai
 * @date: 2024/10/5 17:10
 * @version: v1
 */

import cn.hutool.core.collection.CollUtil;
import org.dromara.common.core.domain.R;
import org.dromara.system.api.domain.bo.RemoteUserBo;
import org.dromara.system.api.domain.vo.RemoteUserVo;
import org.dromara.system.api.feign.fallback.SystemUserFallBack;
import org.dromara.common.core.domain.model.LoginUser;
import org.dromara.common.core.domain.model.XcxLoginUser;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import static org.dromara.common.core.constant.ServerNameConstants.SYSTEM_SERVER_NAME;

@FeignClient(contextId = "system-user-api", name = SYSTEM_SERVER_NAME, fallbackFactory = SystemUserFallBack.class)
public interface SystemUserClient {

    /**
     * 通过用户名查询用户信息
     *
     * @param userName 用户名
     * @param tenantId 租户id
     * @return 结果
     */
    @GetMapping(value = "/api/system/user/info/byUserName")
    R<LoginUser> getUserInfoByUserName(@RequestParam("userName") String userName, @RequestParam("tenantId") String tenantId);

    /**
     * 通过用户id查询用户信息
     *
     * @param userId   用户id
     * @param tenantId 租户id
     * @return 结果
     */
    @GetMapping(value = "/api/system/user/info/byUserId")
    R<LoginUser> getUserInfoByUserId(@RequestParam("userId") Long userId, @RequestParam("tenantId") String tenantId);

    /**
     * 通过手机号查询用户信息
     *
     * @param phoneNumber 手机号
     * @param tenantId    租户id
     * @return 结果
     */
    @GetMapping(value = "/api/system/user/info/byPhoneNumber")
    R<LoginUser> getUserInfoByPhoneNumber(@RequestParam("phoneNumber") String phoneNumber, @RequestParam("tenantId") String tenantId);

    /**
     * 通过邮箱查询用户信息
     *
     * @param email    邮箱
     * @param tenantId 租户id
     * @return 结果
     */
    @GetMapping(value = "/api/system/user/info/byEmail")
    R<LoginUser> getUserInfoByEmail(@RequestParam("email") String email, @RequestParam("tenantId") String tenantId);

    /**
     * 通过openId查询用户信息
     *
     * @param openId
     * @return 结果
     */
    @GetMapping(value = "/api/system/user/info/byOpenId")
    R<XcxLoginUser> getUserInfoByOpenId(@RequestParam("openId") String openId);

    /**
     * 注册用户信息
     *
     * @param remoteUserBo 用户信息
     * @return 结果
     */
    @PostMapping(value = "/api/system/user/register")
    R<Boolean> userRegister(@RequestBody RemoteUserBo remoteUserBo);

    /**
     * 重置用户密码
     *
     * @param userId   用户id
     * @param password 用户密码
     * @return 结果
     */
    @PostMapping(value = "/api/system/user/resetPas")
    R<Boolean> resetUserPas(@RequestParam("userId") Long userId, @RequestParam("password") String password);

    /**
     * 通过用户ID查询用户名
     *
     * @param userId 用户ID
     * @return 用户名
     */
    @GetMapping(value = "/api/system/user/name/byUserId")
    R<String> selectUserNameById(@RequestParam("userId") Long userId);

    /**
     * 通过用户ID查询用户昵称
     *
     * @param userId 用户ID
     * @return 用户昵称
     */
    @GetMapping(value = "/api/system/user/nickName/byUserId")
    R<String> selectNickNameById(@RequestParam("userId") Long userId);

    /**
     * 通过用户ID查询岗位名称
     *
     * @param userId 用户ID
     * @return 岗位名称
     */
    @GetMapping(value = "/api/system/user/postName/byUserId")
    R<String> selectPostnameById(@RequestParam("userId") Long userId);

    /**
     * 通过用户ID查询角色名称
     *
     * @param userId 用户ID
     * @return 角色名称
     */
    @GetMapping(value = "/api/system/user/roleName/byUserId")
    R<String> selectRolenameById(@RequestParam("userId") Long userId);

    /**
     * 通过用户ID集合查询用户昵称集合
     *
     * @param userIds 用户ID 多个用逗号隔开
     * @return 用户昵称集合
     */
    @GetMapping(value = "/api/system/user/nickName/byUserIds")
    R<String> selectNickNameByIds(@RequestParam("userIds") String userIds);

    /**
     * 通过用户ID查询用户手机号
     *
     * @param userId 用户id
     * @return 用户手机号
     */
    @GetMapping(value = "/api/system/user/phoneNumber/byUserId")
    R<String> selectPhonenumberById(@RequestParam("userId") Long userId);

    /**
     * 通过用户ID查询用户邮箱
     *
     * @param userId 用户id
     * @return 用户邮箱
     */
    @GetMapping(value = "/api/system/user/email/byUserId")
    R<String> selectEmailById(@RequestParam("userId") Long userId);

    /**
     * 更新用户信息
     *
     * @param userId 用户ID
     * @param ip     IP地址
     */
    @PostMapping(value = "/api/system/user/save/login/info")
    R<Void> recordLoginInfo(@RequestParam("userId") Long userId, @RequestParam("ip") String ip);

    /**
     * 通过用户ID查询用户列表
     *
     * @param userIds 用户ids
     * @return 用户列表
     */
    @GetMapping(value = "/api/system/user/list/byUserIds")
    R<List<RemoteUserVo>> selectListByIds(@RequestParam("userIds") List<Long> userIds);

    /**
     * 通过角色ID查询用户ID
     *
     * @param roleIds 角色ids
     * @return 用户ids
     */
    @GetMapping(value = "/api/system/user/userIdlist/byRoleIds")
    R<List<Long>> selectUserIdsByRoleIds(@RequestParam("roleIds") List<Long> roleIds);

    /**
     * 通过角色ID查询用户
     *
     * @param roleIds 角色ids
     * @return 用户
     */
    @GetMapping("/api/system/user/userlist/byRoleIds")
    R<List<RemoteUserVo>> selectUsersByRoleIds(@RequestParam("roleIds") List<Long> roleIds);

    /**
     * 通过部门ID查询用户
     *
     * @param deptIds 部门ids
     * @return 用户
     */
    @GetMapping("/api/system/user/userlist/byDeptIds")
    R<List<RemoteUserVo>> selectUsersByDeptIds(@RequestParam("deptIds") List<Long> deptIds);

    /**
     * 通过岗位ID查询用户
     *
     * @param postIds 岗位ids
     * @return 用户
     */
    @GetMapping("/api/system/user/userlist/byPostIds")
    R<List<RemoteUserVo>> selectUsersByPostIds(@RequestParam("postIds") List<Long> postIds);

    /**
     * 根据用户 ID 列表查询用户名称映射关系
     *
     * @param userIds 用户 ID 列表
     * @return Map，其中 key 为用户 ID，value 为对应的用户名称
     */
    @GetMapping("/api/system/user/userName/byUserIds")
    R<Map<Long, String>> selectUserNamesByIds(@RequestParam("userIds") List<Long> userIds);

    /**
     * 获取当前登录用户信息
     *
     * @return 用户信息
     */
    @GetMapping("/api/system/user/getUserInfo")
    R<LoginUser> getUserInfo();

}
